home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / MM2_DEV / S / MOS / OLD_RUNT.I < prev    next >
Encoding:
Text File  |  1990-06-13  |  44.0 KB  |  3 lines

  1. ⓪ IMPLEMENTATION MODULE Runtime;⓪ (*$Y+,L-,R-,N+,C-,M-*)⓪ ⓪ (**********************************************************************⓪ ⓪,Runtime Support fuer Atari Modula-Compiler   V#097⓪ ⓪!30.10.86   Version fuer Atari, mit neuem Stringformat:⓪,CAP, STAS angepasst,⓪,RangeCheck fuer CHR.⓪"1.11.86   STAS fuer Stringlaenge > 32K korrigiert;⓪,Prozeduren zur Coroutinen-Unterstuetzung als Dummy.⓪"3.11.86   CHR und CAP fuer neue Char-Darstellung (mit folgendem SyncByte)⓪!30.11.86   Set-Operationen verkraften ungerade Laengenangaben⓪!19.12.86   TrapCode 7 fuer Zugriff ueber NIL-Pointer definiert⓪!22.01.87   TRAP-Auswertung wieder impl.⓪!04.02.87   STAS: BCS ok2 statt BEQ ok2.⓪!27.02.87   TRAP 15: trp0->trp9; GEM-Alert impl.; DivByZero,TRAPV,Addr- und⓪,Bus-Error abgefangen; Vektor-Restauration per SetTerminateProc;⓪,trp7 (access via NIL-Ptr) raus.⓪!02.03.87   Traps:USP wird gerettet; Scan-Aufruf impl.⓪!19.03.87   Fehlerbehandlung -> GEMError-Modul⓪!09.05.87   TRAP-Nummern geändert⓪!19.06.87   neue Real-Arithmetik⓪!30.06.87   IOTransfer impl.⓪!08.07.87   D7->#1; bei Fehler wird Aufrufer angescanned.⓪!22.07.87   IOTransfer, LISTEN, usw. impl.;⓪!23.07.87   @PRIO impl, IOTransfer kann auch auf Vektoren >= $400 ange-⓪,wendet werden.⓪!11.08.87   abermals D7->#1 in Set-Funktionen (wie kam D7 da wieder hin ??)⓪!29.08.87   @IDIV korrigiert (UNLK u. MOVEM vertauscht)⓪!08.09.87   @IOCA neu⓪!27.10.87   FLOAT und TRUNC auf LONGCARD-Parameter umgestellt⓪!13.11.87   @LSTN decr. IR um Eins⓪!16.12.87   Realvergleiche korrigiert (Null galt als größer als Zahlen⓪-mit negativem Exponenten): RELE, REGE, RELT, REGT⓪!17.12.87   Realvergleiche jetzt hoffentlich ok⓪!16.01.88   @PRIO geht auch im Superv.-Mode⓪!01.04.88   @FPDIV für negativen Divisor korrigiert; @IOCA geht jetzt.⓪!09.04.88   Coroutinen-Anpassung f. 68020.⓪!28.05.88   @RES1 und @RES2 für Procedure Entries (ab Comp 3.6a) verwendet⓪!19.07.88   @SMEM, @RELE, @REGE, @RELT, @REGT zerstören nicht mehr D3/D4.⓪!12.08.88   CAP berücksichtigt auch nicht-deutsche Umlaute.⓪!01.01.88   TRUNC löst Runtime-Error bei neg. Arg. aus⓪!19.01.89   881-Unterstützung von MR (26.8.88) übernommen (Cond: A68881)⓪!15.06.89   Include-File f. Prozessoren⓪!16.06.89   881-Routinen überarbeitet (optimiert, Errors)⓪!04.07.89   @STAS korrigiert - machte bei ungeradem Source-String Mist⓪!19.08.89   Runtime läuft nun gleichzeitg mit 68000 & 68020⓪!30.11.89   Optimierungen in Long-Mul/Div/Mod (LINK verlagert)⓪ ***********************************************************************)⓪ ⓪ FROM SYSTEM IMPORT ASSEMBLER, ADDRESS, WORD;⓪ ⓪ IMPORT SysInfo;⓪ ⓪ FROM SFP004 IMPORT FPUInit, FPUError;⓪ ⓪ CONST⓪ ⓪ (*$I FPU.CNF *)⓪ ⓪(DftSF = $0010;⓪ ⓪ VAR     has020: BOOLEAN;⓪ ⓪ (*$? A68881:⓪ CONST⓪(fpstat  =  $fffa40;       (* Response word of MC68881 read *)⓪(fpstatlo=  $fffa41;⓪(fpctrl  =  $fffa42;       (* Control  word of MC68881 write *)⓪(fpcmd   =  $fffa4a;       (* Command  word of MC68881 write *)⓪(fpcond  =  $fffa4e;       (* Condition word of MC68881 write *)⓪(fpop    =  $fffa50;       (* Operand  long of MC68881 read/write *)⓪ *)⓪ ⓪ (************** Coroutinen-Unterstuetzung **************)⓪ ⓪ ⓪ PROCEDURE BadReturn;  (* RTS aus CoRoutine anmeckern *)⓪"BEGIN⓪$ASSEMBLER⓪(TRAP    #6⓪(DC.W    -15-$6000       ; kein cont, scan prev⓪$END⓪"END BadReturn;⓪ ⓪ ⓪ (*⓪#Transferdaten beim Usermode:⓪(2  Byte - 0: zeigt Usermode an / 1: Vektor zus. restaurieren⓪(4  Byte - PC⓪(2  Byte - SR⓪(4  Byte - A6⓪(56 Byte - D0-A5⓪ ⓪#Transferdaten beim Supervisormode:⓪(2  Byte - $FFxx, zeigt Supervisormode an⓪(4  Byte - USP⓪(60 Byte - D0-A6⓪(4  Byte - Dummy⓪(2  Byte - SR⓪(4  Byte - PC⓪ *)⓪ ⓪ (* Kennung:      Zustand:⓪$0             Normal u. Exc-Rückkehr - Usermode⓪$1             Warten auf Exc - Usermode, Vektor restaurieren⓪$$FF           Exc-Rückkehr - Supervisormode⓪ *)⓪ ⓪ PROCEDURE @NEWP ( p:PROC; a:ADDRESS; n:LONGCARD; VAR prc:ADDRESS );⓪"BEGIN⓪$ASSEMBLER⓪(LINK    A5,#0⓪(⓪(MOVE.L  -(A3),A1        ; 'prc'⓪(MOVE.L  -(A3),A0        ; SIZE (workspace)⓪(MOVE.L  A0,D1⓪(BCLR    #0,D1⓪(MOVE.L  -(A3),D0        ; ADR (workspace)⓪(ADDQ.L  #1,D0⓪(BCLR    #0,D0⓪(ADDA.L  D0,A0           ; ENDADR (workspace)⓪(MOVE.L  -(A3),D2        ; ADR (procedure)⓪(CMPI.L  #90,D1          ; ist workspace groß genug ?⓪(BCC     wspOk⓪(⓪(TRAP    #6⓪(DC.W    -10-$4000       ; 'out of stack'⓪(UNLK    A5⓪(RTS⓪(⓪&wspOk:⓪(MOVEM.L A3/A5,-(A7)⓪(⓪(MOVE.L  D0,A3⓪(⓪(MOVE.L  D2,-(A0)         ;Adresse für scan⓪(ADDQ.L  #2,(A0)          ;scan-Adr etwas vorsetzen⓪(CLR.L   -(A0)            ;voriges A5⓪(MOVE.L  A0,A5            ;für UNLK in backScan()⓪(MOVE.L  #BadReturn,-(A0) ;Fehlerbehandlung bei RTS aus Coroutine⓪(⓪(MOVEM.L D0-A5,-(A0)      ; Bis auf A3,A5 nur Dummy-Werte⓪(MOVE.L  A6,-(A0)⓪(MOVE.W  SR,-(A0)⓪(MOVE.L  D2,-(A0)⓪(CLR.W   -(A0)⓪(⓪(; nun den SP in 'prc' ablegen⓪(MOVE.L  A0,(A1)⓪(⓪(MOVEM.L (A7)+,A3/A5⓪(UNLK    A5⓪$END⓪"END @NEWP;⓪ ⓪ PROCEDURE @TRAN ( VAR source,dest:ADDRESS );  (* Transfer *)⓪"BEGIN⓪$ASSEMBLER⓪(; Aufruf erfolgt immer im Usermode, der zu startende Prozeß⓪(; kann in beiden Modi ablaufen⓪(⓪(MOVE.L  -(A3),A2        ; dest⓪(MOVE.L  -(A3),A1        ; source⓪(MOVE    SR,D2⓪(⓪(; JSR     EnterSupervisorMode⓪(⓪(MOVE    #$2700,SR       ; keine Interrupts !⓪(⓪(; ③aktiven Prozeß beenden④⓪(MOVE.L  USP,A0⓪(MOVE.L  (A0)+,D0        ; Rücksprungadr. hinter TRANSFER⓪(MOVEM.L D0-A5,-(A0)⓪(MOVE.L  A6,-(A0)⓪(MOVE.W  D2,-(A0)⓪(MOVE.L  D0,-(A0)⓪(CLR.W   -(A0)⓪(⓪(MOVE.L  (A2),D0         ; zuerst retten, falls A1=A2⓪(MOVE.L  A0,(A1)⓪(MOVE.L  D0,A6⓪(⓪(; ③neuen Prozeß starten④⓪(TST.W   (A6)+⓪(BEQ     stUsr⓪(BMI     stSup⓪(⓪(; starte Usermode, vorher Vektor restaurieren⓪(MOVE.L  (A6)+,D0        ; alter Vektor⓪(MOVE.L  4+2+4+4(A6),A0  ; D1: Vektoradr.⓪(MOVE.L  D0,(A0)⓪(TST     has020⓪(BEQ     no20⓪(MOVE    #DftSF,-(A7)⓪ no20:⓪(MOVE.L  (A6)+,-(A7)     ; PC⓪(MOVE.W  (A6)+,-(A7)     ; SR⓪(MOVE.L  (A6)+,-(A7)     ; A6⓪(MOVEM.L (A6)+,D0-A5⓪(MOVE.L  A6,USP⓪(MOVE.L  (A7)+,A6⓪(RTE⓪(⓪ stUsr:  ; starte Usermode⓪(TST     has020⓪(BEQ     no20b⓪(MOVE    #DftSF,-(A7)⓪ no20b:⓪(MOVE.L  (A6)+,-(A7)     ; PC⓪(MOVE.W  (A6)+,-(A7)     ; SR⓪(MOVE.L  (A6)+,-(A7)     ; A6⓪(MOVEM.L (A6)+,D0-A5⓪(MOVE.L  A6,USP⓪(MOVE.L  (A7)+,A6⓪(RTE⓪(⓪ stSup:  ; starte Supervisormode⓪(MOVE.L  A6,A7⓪(MOVE.L  (A7)+,A0⓪(MOVE.L  A0,USP⓪(MOVEM.L (A7)+,D0-A6⓪(ADDQ.L  #4,A7⓪(TST     has020⓪(BEQ     no20c⓪(MOVE.W  (A7),-(A7)⓪(MOVE.L  4(A7),2(A7)⓪(MOVE    #DftSF,6(A7)⓪ no20c:⓪(RTE⓪$END⓪"END @TRAN;⓪ ⓪ PROCEDURE @LSTN;⓪"BEGIN⓪$ASSEMBLER⓪(; JSR     EnterSupervisorMode⓪(MOVE    SR,-(A7)⓪(MOVE    SR,D0⓪(ANDI    #$0700,D0⓪(BEQ     ok⓪(MOVE    SR,D0⓪(SUBI    #$0100,D0⓪(MOVE    D0,SR⓪(NOP⓪(NOP⓪&ok:⓪(MOVE    (A7)+,SR⓪(ANDI    #$FFFF-$2000,SR ; Back into user mode⓪$END⓪"END @LSTN;⓪ ⓪ PROCEDURE hdlExc;⓪"(* Für IOTRANSFER-Auslösungen per Exception *)⓪"BEGIN⓪$ASSEMBLER⓪(; Der Aufruf kann aus beiden Modi kommen, der zu startende⓪(; Prozeß ist immer im Usermode⓪(⓪(MOVE    #$2700,SR       ; keine Interrupts !⓪(⓪(BTST.B  #5,4(A7)        ; aus welchem mode ?⓪(BNE     frSup⓪(⓪(; Entry aus User mode⓪(⓪(; Daten auf den USP retten⓪(MOVE.L  A6,-(A7)⓪(MOVE.L  USP,A6⓪(MOVEM.L D0-A5,-(A6)⓪(MOVE.L  (A7)+,-(A6)⓪(MOVE.L  (A7)+,A0        ; ^Transfer-Daten⓪(MOVE    (A7)+,-(A6)     ; SR⓪(MOVE.L  (A7)+,-(A6)     ; PC⓪(CLR.W   -(A6)⓪(⓪(; A0 zeigt auf:⓪(; 2  Byte - 1, zeigt IOTR an⓪(; 4  Byte - alter Exc-Vektor⓪(; 4  Byte - PC⓪(; 2  Byte - SR⓪(; 4  Byte - A6⓪(; 56 Byte - D0-A5⓪(⓪(MOVE.L  2+4+4+2+4+32+8(A0),A2  ; A2: alter dest^⓪(MOVE.L  A6,(A2)⓪(⓪(MOVE.L  2+4+4+2+4+4(A0),A3  ; D1: Vektoradr.⓪(LEA     2(A0),A6⓪(MOVE.L  (A6)+,(A3)      ; alten Vektor restaurieren⓪(TST     has020⓪(BEQ     no20d⓪(MOVE    #DftSF,-(A7)⓪ no20d:⓪(MOVE.L  (A6)+,-(A7)     ; PC⓪(MOVE.W  (A6)+,-(A7)     ; SR⓪(MOVE.L  (A6)+,-(A7)     ; A6⓪(MOVEM.L (A6)+,D0-A5⓪(MOVE.L  A6,USP⓪(MOVE.L  (A7)+,A6⓪(RTE⓪(⓪ frSup:  ; Entry aus Supervisor mode⓪(⓪(; Daten auf den USP retten⓪(MOVEM.L D0-A6,-(A7)⓪(MOVE.L  USP,A6⓪(MOVE.L  A6,-(A7)⓪(ST.B    -(A7)⓪(⓪(MOVE.L  2+4+60(A7),A0         ; ^Transfer-Daten⓪(⓪(; A0: (s.o.)⓪(⓪(MOVE.L  2+4+4+2+4+32+8(A0),A2   ; A2: alter dest^⓪(MOVE.L  A7,(A2)⓪(⓪(MOVE.L  2+4+4+2+4+4(A0),A3  ; D1: Vektoradr.⓪(LEA     2(A0),A6⓪(MOVE.L  (A6)+,(A3)      ; alten Vektor restaurieren⓪(TST     has020⓪(BEQ     no20e⓪(MOVE    #DftSF,-(A7)⓪ no20e:⓪(MOVE.L  (A6)+,-(A7)     ; PC⓪(MOVE.W  (A6)+,-(A7)     ; SR⓪(MOVE.L  (A6)+,-(A7)     ; A6⓪(MOVEM.L (A6)+,D0-A5⓪(MOVE.L  A6,USP⓪(MOVE.L  (A7)+,A6⓪(RTE⓪$END⓪"END hdlExc;⓪ ⓪ PROCEDURE hdlCall;⓪"(* Für IOTRANSFER-Auslösungen per JSR *)⓪"BEGIN⓪$ASSEMBLER⓪(; Der Aufruf kann aus beiden Modi kommen, der zu startende⓪(; Prozeß ist immer im Usermode⓪(⓪(MOVE.L  D1,-(A7)⓪(MOVE    SR,D1⓪(BTST    #13,D1          ; aus welchem Mode ?⓪(BNE     frSup⓪(⓪(; Entry aus User mode⓪(⓪(; JSR     EnterSupervisorMode⓪(⓪(;BREAK⓪(MOVE    #$2700,SR       ; keine Interrupts !⓪(⓪(; ③aktiven Prozeß beenden, Daten auf den USP retten⓪(; auf USP stehen noch: D1.L, 2 Byte,  ^Dest-Transfer-Daten, PC.L⓪(MOVE.L  A0,-(A7)⓪(MOVE.L  USP,A0⓪(MOVE.L  (A0)+,-(A7)     ; D1 retten⓪(MOVE.L  (A0)+,-(A7)     ; ^Transfer-Daten⓪(MOVE.L  (A0)+,-(A7)     ; PC retten⓪(MOVEM.L D0-A5,-(A0)⓪(MOVE.L  A6,-(A0)⓪(MOVE.W  D1,-(A0)        ; SR⓪(MOVE.L  (A7)+,-(A0)     ; PC⓪(MOVE.L  (A7)+,14(A0)    ; D1 in Transfer-Daten ablegen⓪(MOVE.L  (A7)+,A1        ; ^Transfer-Daten⓪(MOVE.L  (A7)+,42(A0)    ; A0 in Transfer-Daten ablegen⓪(CLR.W   -(A0)⓪(⓪(; A1 zeigt auf:⓪(; 2  Byte - 1, zeigt IOTR an⓪(; 4  Byte - alter Exc-Vektor⓪(; 4  Byte - PC⓪(; 2  Byte - SR⓪(; 4  Byte - A6⓪(; 56 Byte - D0-A5⓪(⓪(MOVE.L  2+4+4+2+4+32+8(A1),A2  ; A2: alter dest^⓪(MOVE.L  A6,(A2)⓪(⓪(MOVE.L  2+4+4+2+4+4(A1),A3  ; D1: Vektoradr.⓪(LEA     2(A1),A6⓪(MOVE.L  (A6)+,(A3)      ; alten Vektor restaurieren⓪(TST     has020⓪(BEQ     no20f⓪(MOVE    #DftSF,-(A7)⓪ no20f:⓪(MOVE.L  (A6)+,-(A7)     ; PC⓪(MOVE.W  (A6)+,-(A7)     ; SR⓪(MOVE.L  (A6)+,-(A7)     ; A6⓪(MOVEM.L (A6)+,D0-A5⓪(MOVE.L  A6,USP⓪(MOVE.L  (A7)+,A6⓪(RTE⓪(⓪ frSup:  ; Entry aus Supervisor mode⓪(⓪(MOVE.L  (A7),D1⓪(ADDQ.L  #2,A7⓪(MOVE.L  2(A7),(A7)      ; ^Transfer-Daten 2 Byte tiefer⓪(MOVE    SR,4(A7)        ; SR darüber⓪(⓪(;BREAK⓪(MOVE    #$2700,SR       ; keine Interrupts !⓪(⓪(; ③aktiven Prozeß beenden, Daten auf den USP retten⓪(MOVEM.L D0-A6,-(A7)⓪(MOVE.L  USP,A0⓪(MOVE.L  A0,-(A7)⓪(ST.B    -(A7)⓪(⓪(MOVE.L  2+4+60(A7),A0         ; ^Transfer-Daten⓪(⓪(; A0: (s.o.)⓪(⓪(MOVE.L  2+4+4+2+4+32+8(A0),A2   ; A2: alter dest^⓪(MOVE.L  A7,(A2)⓪(⓪(MOVE.L  2+4+4+2+4+4(A0),A3  ; D1: Vektoradr.⓪(LEA     2(A0),A6⓪(MOVE.L  (A6)+,(A3)      ; alten Vektor restaurieren⓪(TST     has020⓪(BEQ     no20g⓪(MOVE    #DftSF,-(A7)⓪ no20g:⓪(MOVE.L  (A6)+,-(A7)     ; PC⓪(MOVE.W  (A6)+,-(A7)     ; SR⓪(MOVE.L  (A6)+,-(A7)     ; A6⓪(MOVEM.L (A6)+,D0-A5⓪(MOVE.L  A6,USP⓪(MOVE.L  (A7)+,A6⓪(RTE⓪$END⓪"END hdlCall;⓪ ⓪ ⓪ PROCEDURE @IOTR ( VAR source,dest:ADDRESS; vecAddr:ADDRESS );⓪"CONST JSRInstr = $4EB9;⓪"BEGIN⓪$ASSEMBLER⓪(; Aufruf erfolgt immer im Usermode, der zu startende Prozeß⓪(; kann in beiden Modi ablaufen⓪(⓪(MOVE.L  -(A3),D1        ; vector⓪(MOVE.L  -(A3),A2        ; dest⓪(MOVE.L  -(A3),A1        ; source⓪(MOVE    SR,D2⓪(⓪(; JSR     EnterSupervisorMode⓪(⓪(MOVE    #$2700,SR       ; keine Interrupts !⓪(⓪(; Daten für 'hdlExc' und 'hdlCall':⓪(; 2  Byte - 1, zeigt IOTR an⓪(; 4  Byte - alter Exc-Vektor⓪(; 4  Byte - PC⓪(; 2  Byte - SR⓪(; 4  Byte - A6⓪(; 56 Byte - D0-A5⓪(⓪(; ③aktiven Prozeß beenden④⓪(MOVE.L  USP,A0⓪(MOVE.L  (A0)+,D0        ; Rücksprungadr. hinter IOTRANSFER⓪(MOVEM.L D0-A5,-(A0)⓪(MOVE.L  A6,-(A0)⓪(MOVE.W  D2,-(A0)⓪(MOVE.L  D0,-(A0)⓪(⓪(MOVE.L  D1,A3⓪(MOVE.L  (A3),-(A0)      ; alten vektor retten⓪(⓪(MOVE    #1,-(A0)⓪(⓪(MOVE.L  (A2),D0         ; zuerst retten, falls A1=A2⓪(MOVE.L  A0,(A1)⓪(MOVE.L  D0,A6⓪(⓪(CMPA.W  #$400,A3⓪(BCS     isExc⓪(MOVE.L  #hdlCall,-(A0)⓪(BRA     cont0⓪ isExc   MOVE.L  #hdlExc,-(A0)⓪ cont0   MOVE    #JSRInstr,-(A0)⓪(⓪(MOVE.L  A0,(A3)         ; neuen vektor auf 'JSR hdlExc/hdlCall'⓪(⓪(; ③neuen Prozeß starten④⓪(TST.W   (A6)+⓪(BEQ     stUsr⓪(BMI     stSup⓪(⓪(; starte Usermode, vorher Vektor restaurieren⓪(MOVE.L  (A6)+,D0        ; alter Vektor⓪(MOVE.L  4+2+4+4(A6),A0  ; D1: Vektoradr.⓪(MOVE.L  D0,(A0)⓪(TST     has020⓪(BEQ     no20h⓪(MOVE    #DftSF,-(A7)⓪ no20h:⓪(MOVE.L  (A6)+,-(A7)     ; PC⓪(MOVE.W  (A6)+,-(A7)     ; SR⓪(MOVE.L  (A6)+,-(A7)     ; A6⓪(MOVEM.L (A6)+,D0-A5⓪(MOVE.L  A6,USP⓪(MOVE.L  (A7)+,A6⓪(RTE⓪(⓪ stUsr:  ; starte Usermode⓪(TST     has020⓪(BEQ     no20i⓪(MOVE    #DftSF,-(A7)⓪ no20i:⓪(MOVE.L  (A6)+,-(A7)     ; PC⓪(MOVE.W  (A6)+,-(A7)     ; SR⓪(MOVE.L  (A6)+,-(A7)     ; A6⓪(MOVEM.L (A6)+,D0-A5⓪(MOVE.L  A6,USP⓪(MOVE.L  (A7)+,A6⓪(RTE⓪(⓪ stSup:  ; starte Supervisormode⓪(MOVE.L  A6,A7⓪(MOVE.L  (A7)+,A0⓪(MOVE.L  A0,USP⓪(MOVEM.L (A7)+,D0-A6⓪(ADDQ.L  #4,A7⓪(TST     has020⓪(BEQ     no20j⓪(MOVE.W  (A7),-(A7)⓪(MOVE.L  4(A7),2(A7)⓪(MOVE    #DftSF,6(A7)⓪ no20j:⓪(RTE⓪$END⓪"END @IOTR;⓪ ⓪ ⓪ PROCEDURE @IOCA ( vecAddr:ADDRESS );⓪"BEGIN⓪$ASSEMBLER⓪(MOVE.L  -(A3),A1⓪(CMPA.L  #$400,A1⓪(BCS     isExc⓪(MOVEM.L D3-D7/A3-A6,-(A7)⓪(; JSR     EnterSupervisorMode     ; Regs D0,A0 können verändert werden !⓪(MOVE.L  (A1),A1⓪(JSR     (A1)⓪(ANDI    #$CFFF,SR⓪(MOVEM.L (A7)+,D3-D7/A3-A6⓪(RTS⓪&isExc:⓪(MOVE.L  (A7)+,A2⓪(MOVE    SR,D1⓪(; JSR     EnterSupervisorMode     ; Regs D0,A0 können verändert werden !⓪(MOVE.L  (A1),A1⓪(TST     has020⓪(BEQ     no20k⓪(MOVE    #DftSF,-(A7)⓪ no20k:⓪(MOVE.L  A2,-(A7)⓪(MOVE    D1,-(A7)⓪(JMP     (A1)            ; rettet sicher alle Register⓪$END⓪"END @IOCA;⓪ ⓪ ⓪ PROCEDURE @PRIO;  (* Set Interrupt Priority *)⓪"BEGIN⓪$(* IR-level in D2, auf Bitpos. wie SR; A2 nicht verändern ! *);⓪$ASSEMBLER⓪(MOVE    SR,D0⓪(BTST    #13,D0⓪(BNE     sup                     ; wir sind im Supervisormode⓪(; JSR     EnterSupervisorMode⓪(MOVE    D2,SR⓪(RTS⓪&sup:⓪(ANDI    #$F0FF,D0⓪(ANDI    #$0F00,D2⓪(OR      D2,D0⓪(MOVE    D0,SR⓪$END⓪"END @PRIO;⓪ ⓪ ⓪ PROCEDURE @EXCL; (* Exclude Element aus Set *)⓪"⓪"BEGIN (* SetAdr und Element auf Stack *)⓪$ASSEMBLER⓪'MOVE.W  -(A3),D0⓪'MOVE.W  D0,D1⓪'LSR.W   #3,D0⓪'MOVE.L  -(A3),A0⓪'BCLR    D1,0(A0,D0.W)   END⓪"END @EXCL;⓪"⓪ ⓪ PROCEDURE @INCL; (* Include Element in Set *)⓪ ⓪"BEGIN (* SetAdr und Element auf Stack *)⓪$ASSEMBLER⓪(MOVE.W  -(A3),D0⓪(MOVE.W  D0,D1⓪(LSR.W   #3,D0⓪(MOVE.L  -(A3),A0⓪(BSET    D1,0(A0,D0.W)   END⓪$END @INCL;⓪"⓪ ⓪ PROCEDURE @SAND; (* '*' auf Sets *)⓪ ⓪#BEGIN (* zwei Sets auf Stack, Laenge in D0 *)⓪)ASSEMBLER⓪+MOVE.L  A3,A0⓪+ADDQ.W  #1,D0⓪+BCLR    #0,D0    ;sync. D0⓪+SUBA.W  D0,A0⓪%Lp    MOVE.W  -(A3),D1⓪+AND.W   D1,-(A0)⓪+SUBQ.W  #2,D0⓪+BHI     Lp⓪)END⓪#END @SAND;⓪!⓪ ⓪ PROCEDURE @SXOR; (* '/' auf Sets *)⓪ ⓪"BEGIN (* zwei Sets auf Stack, Laenge in D0 *)⓪(ASSEMBLER⓪*MOVE.L  A3,A0⓪*ADDQ.W  #1,D0⓪*BCLR    #0,D0    ;sync. D0⓪*SUBA.W  D0,A0⓪$Lp    MOVE.W  -(A3),D1⓪*EOR.W   D1,-(A0)⓪*SUBQ.W  #2,D0⓪*BHI     Lp⓪(END⓪"END @SXOR;⓪!⓪ ⓪ PROCEDURE @SSUM; (* '+' auf Sets *)⓪ ⓪"BEGIN (* zwei Sets auf Stack, Laenge in D0 *)⓪(ASSEMBLER⓪*MOVE.L  A3,A0⓪*ADDQ.W  #1,D0⓪*BCLR    #0,D0    ;sync. D0⓪*SUBA.W  D0,A0⓪$Lp    MOVE.W  -(A3),D1⓪*OR.W    D1,-(A0)⓪*SUBQ.W  #2,D0⓪*BHI     Lp⓪(END⓪"END @SSUM;⓪!⓪ ⓪ PROCEDURE @SDIF; (* '-' auf Sets *)⓪ ⓪"BEGIN (* zwei Sets auf Stack, Laenge in D0 *)⓪(ASSEMBLER⓪*MOVE.L  A3,A0⓪*ADDQ.W  #1,D0⓪*BCLR    #0,D0    ;sync. D0⓪*SUBA.W  D0,A0⓪$Lp    MOVE.W  -(A3),D1⓪*AND.W   -(A0),D1⓪*EOR.W   D1,(A0)⓪*SUBQ.W  #2,D0⓪*BHI     Lp⓪(END⓪"END @SDIF;⓪ ⓪ ⓪ PROCEDURE @SMEM; (* IN-Operator auf Sets *)⓪ ⓪"BEGIN (* Element.W und Set auf Stack, SetLaenge in D0 *)⓪$ASSEMBLER⓪(MOVE.W  D0,D1⓪(NEG.W   D1⓪(BCLR    #0,D1⓪(LEA     0(A3,D1.W),A0       ;A0 ist ^SetAnfang⓪(MOVE.W  -(A0),D2⓪(MOVE.W  D2,D1⓪(LSR.W   #3,D2⓪(CMP.W   D0,D2⓪(BCC     NOMEM⓪(BTST    D1,2(A0,D2.W)⓪(BEQ     NOMEM⓪(MOVE.L  A0,A3⓪(MOVE.W  #1,(A3)+⓪(RTS⓪&NOMEM⓪(MOVE.L  A0,A3⓪(CLR     (A3)+⓪$END⓪"END @SMEM;⓪"⓪ ⓪ PROCEDURE @SEQL; (* '=' auf Sets *)⓪ ⓪"BEGIN (* zwei Sets auf Stack, Laenge in D0 *)⓪(ASSEMBLER⓪*MOVE.W  D0,D1⓪*NEG.W   D1⓪*BCLR    #0,D1⓪*LEA     0(A3,D1.W),A0   ;^Anfang des 2. Sets⓪*LEA     0(A0,D1.W),A1   ;^Anfang des 1. Sets⓪*MOVE.L  A1,D1⓪*SUBQ.W  #1,D0⓪$Lp    CMPM.B  (A0)+,(A1)+⓪*DBNE    D0,Lp⓪*SEQ     D0⓪*AND.W   #1,D0⓪*MOVE.L  D1,A3⓪*MOVE.W  D0,(A3)+⓪(END⓪"END @SEQL;⓪ ⓪ ⓪ PROCEDURE @SNEQ; (* '#' auf Sets *)⓪ ⓪"BEGIN (* zwei Sets auf Stack, Laenge in D0 *)⓪(ASSEMBLER⓪*MOVE.W  D0,D1⓪*NEG.W   D1⓪*BCLR    #0,D1⓪*LEA     0(A3,D1.W),A0   ;^Anfang des 2. Sets⓪*LEA     0(A0,D1.W),A1   ;^Anfang des 1. Sets⓪*MOVE.L  A1,D1⓪*SUBQ.W  #1,D0⓪$Lp    CMPM.B  (A0)+,(A1)+⓪*DBNE    D0,Lp⓪*SNE     D0⓪*AND.W   #1,D0⓪*MOVE.L  D1,A3⓪*MOVE.W  D0,(A3)+⓪(END⓪"END @SNEQ;⓪ ⓪ ⓪ PROCEDURE @SLEQ; (* '<=' auf Sets *)⓪ ⓪"BEGIN (* zwei Sets auf Stack, Laenge in D0 *)⓪(ASSEMBLER⓪*MOVE.W  D0,D1⓪*NEG.W   D1⓪*BCLR    #0,D1⓪*LEA     0(A3,D1.W),A0   ;^Anfang des 2. Sets⓪*LEA     0(A0,D1.W),A1   ;^Anfang des 1. Sets⓪*MOVE.L  A1,D2⓪*SUBQ.W  #1,D0⓪$Lp    MOVE.B  (A1),D1⓪*AND.B   (A0)+,D1⓪*EOR.B   D1,(A1)+        ;Set1 * Set2 =! Set1⓪*DBNE    D0,Lp⓪*SEQ     D0⓪*AND.W   #1,D0⓪*MOVEA.L D2,A3⓪*MOVE.W  D0,(A3)+⓪(END⓪"END @SLEQ;⓪ ⓪ ⓪ PROCEDURE @SGEQ; (* '>=' auf Sets *)⓪ ⓪"BEGIN (* zwei Sets auf Stack, Laenge in D0 *)⓪(ASSEMBLER⓪*MOVE.W  D0,D1⓪*NEG.W   D1⓪*BCLR    #0,D1⓪*LEA     0(A3,D1.W),A0   ;^Anfang des 2. Sets⓪*LEA     0(A0,D1.W),A1   ;^Anfang des 1. Sets⓪*MOVE.L  A1,D2⓪*SUBQ.W  #1,D0⓪$Lp    MOVE.B  (A0),D1⓪*AND.B   (A1)+,D1⓪*EOR.B   D1,(A0)+        ;Set1 * Set2 =! Set2⓪*DBNE    D0,Lp⓪*SEQ     D0⓪*AND.W   #1,D0⓪*MOVEA.L D2,A3⓪*MOVE.W  D0,(A3)+⓪(END⓪"END @SGEQ;⓪ ⓪ (********* Real-Vergleiche *********)⓪ ⓪ PROCEDURE @REEQ (a,b:LONGREAL):BOOLEAN;        (* a = b *)⓪ BEGIN⓪"ASSEMBLER⓪$; !!! sind bei 881 nicht unbenutzte Bits, die hier falsche Erg. liefern k?⓪$MOVE.L -(A3),D0⓪$MOVE.L -(A3),D1⓪$MOVE.L -(A3),D2⓪$CMP.L  -(A3),D1⓪$BNE    NE⓪$CMP.L  D0,D2⓪$BNE    NE⓪$MOVE.W #true,(A3)+⓪$RTS⓪ !NE CLR.W (A3)+⓪"END⓪ END @REEQ;⓪ ⓪ PROCEDURE @RENE (a,b:LONGREAL):BOOLEAN;        (* a # b *)⓪ BEGIN⓪"ASSEMBLER⓪$; !!! sind bei 881 nicht unbenutzte Bits, die hier falsche Erg. liefern k?⓪$MOVE.L -(A3),D0⓪$MOVE.L -(A3),D1⓪$MOVE.L -(A3),D2⓪$CMP.L  -(A3),D1⓪$BNE    NE⓪$CMP.L  D0,D2⓪$BNE    NE⓪$CLR.W (A3)+⓪$RTS⓪ !NE MOVE.W #true,(A3)+⓪"END⓪ END @RENE;⓪ ⓪ (*********** Longint - Arithmetik ***********)⓪ ⓪ PROCEDURE @IMUL (a,b:LONGINT):LONGINT;⓪ BEGIN⓪#ASSEMBLER⓪'MOVE.L D3,-(A7)⓪'CLR.W  D3⓪'MOVE.L -(A3),D0⓪'BPL    IMUL5⓪'NEG.L  D0⓪'MOVEQ  #1,D3⓪ !IMUL5 MOVE.L -(A3),D1⓪'BPL    IMUL4⓪'NEG.L  D1⓪'BCHG   #0,D3⓪ !IMUL4 MOVE.L D0,D2⓪'MULU   D1,D0⓪'SWAP   D1⓪'TST.W  D1⓪'BEQ    IMUL1⓪'SWAP   D2⓪'TST.W  D2⓪'BEQ    IMUL2⓪'BNE    IMERR⓪ !IMUL1 SWAP   D1⓪ !IMUL2 SWAP   D2⓪'MULU   D1,D2⓪'SWAP   D2⓪'TST.W  D2⓪'BNE    IMERR⓪'ADD.L  D2,D0⓪'BVS    IMERR⓪'BMI    IMERR⓪'TST.W  D3⓪'BEQ    IMUL3⓪'NEG.L  D0⓪ !IMUL3 MOVE.L D0,(A3)+⓪'MOVE.L (A7)+,D3⓪'RTS⓪'⓪ !IMERR LINK   A5,#0⓪'TRAP    #6          ; Overflow⓪'DC.W    -7-$4000⓪'CLR.L   (A3)+⓪'MOVE.L (A7)+,D3⓪'UNLK   A5⓪#END⓪ END @IMUL;⓪ ⓪ PROCEDURE @CMUL (a,b:LONGCARD):LONGCARD;⓪ BEGIN⓪"ASSEMBLER⓪'MOVE.L -(A3),D0⓪'MOVE.L -(A3),D1⓪'MOVE.L D0,D2⓪'MULU   D1,D0⓪'SWAP   D1⓪'TST.W  D1⓪'BEQ    CMUL1⓪'SWAP   D2⓪'TST.W  D2⓪'BEQ    CMUL2⓪'BNE    CMERR⓪ !CMUL1 SWAP   D1⓪ !CMUL2 SWAP   D2⓪'MULU   D1,D2⓪'SWAP   D2⓪'TST.W  D2⓪'BNE    CMERR⓪'ADD.L  D2,D0⓪'BCS    CMERR⓪'MOVE.L D0,(A3)+⓪'RTS⓪'⓪ !CMERR LINK   A5,#0⓪'TRAP    #6          ; Overflow⓪'DC.W    -7-$4000⓪'CLR.L   (A3)+⓪'UNLK   A5⓪#END⓪ END @CMUL;⓪ ⓪ PROCEDURE @IDIV (a,b:LONGINT):LONGINT;⓪ BEGIN⓪#ASSEMBLER⓪(MOVEM.L D4-D5,-(A7)⓪(⓪(CLR.W  D5⓪(MOVE.L -(A3),D0⓪(BEQ    IDERR⓪(BPL    IDIV5⓪(NEG.L  D0⓪(MOVEQ  #1,D5⓪ !IDIV5  MOVE.L -(A3),D1⓪(BPL    IDIV6⓪(NEG.L  D1⓪(BCHG   #0,D5⓪ !IDIV6  CLR.L  D2⓪(CLR.L  D4⓪ !IDIV1  CMP.L  D0,D1⓪(BLS    IDIV2⓪(LSL.L  #1,D0⓪(ADDQ.W #1,D2⓪(BRA    IDIV1⓪ !IDIV3  LSR.L  #1,D0⓪ !IDIV2  LSL.L  #1,D4⓪(CMP.L  D0,D1⓪(BCS    IDIV4⓪(SUB.L  D0,D1⓪(ADDQ.W #1,D4⓪ !IDIV4  DBF    D2,IDIV3⓪(TST.W  D5⓪(BEQ    IDIV7⓪(NEG.L  D4⓪ !IDIV7  MOVE.L D4,(A3)+⓪(MOVEM.L (A7)+,D4-D5⓪(RTS⓪(⓪ !IDERR  LINK   A5,#0⓪(TRAP    #6          ; Div by zero⓪(DC.W    -5-$4000⓪(CLR.L   (A3)+⓪(MOVEM.L (A7)+,D4-D5⓪(UNLK   A5⓪$END⓪ END @IDIV;⓪ ⓪ PROCEDURE @CDIV (a,b:LONGCARD):LONGCARD;⓪ BEGIN⓪ ASSEMBLER⓪'MOVE.L D3,-(A7)⓪'MOVE.L -(A3),D0⓪'BEQ    CDERR⓪'MOVE.L -(A3),D1⓪'CLR.L  D2⓪'CLR.L  D3⓪'TST.L  D0⓪'BMI    CDIV2⓪ !CDIV1 CMP.L  D0,D1⓪'BLS    CDIV2⓪'ADDQ   #1,D2⓪'ASL.L  #1,D0⓪'BPL    CDIV1⓪ !CDIV2 ASL.L  #1,D3⓪'CMP.L  D0,D1⓪'BCS    CDIV3⓪'SUB.L  D0,D1⓪'ADDQ   #1,D3⓪ !CDIV3 LSR.L  #1,D0⓪'DBF    D2,CDIV2⓪'MOVE.L D3,(A3)+⓪'MOVE.L (A7)+,D3⓪'RTS⓪'⓪ !CDERR LINK   A5,#0⓪'TRAP    #6          ; Div by zero⓪'DC.W    -5-$4000⓪'CLR.L   (A3)+⓪'MOVE.L (A7)+,D3⓪'UNLK   A5⓪ END⓪ END @CDIV;⓪ ⓪ PROCEDURE @IMOD (a,b:LONGINT):LONGINT;⓪ BEGIN⓪ ASSEMBLER⓪'MOVE.L D5,-(A7)⓪'CLR.W  D5⓪'CLR.L  D2⓪'MOVE.L -(A3),D0⓪'BEQ    IMODER⓪'BPL    IMOD2⓪'NEG.L  D0⓪ !IMOD2 MOVE.L -(A3),D1⓪'BPL    IMOD1⓪'NEG.L  D1⓪'MOVEQ  #1,D5⓪ !IMOD1 CMP.L  D0,D1⓪'BLS    IMOD5⓪'LSL.L  #1,D0⓪'ADDQ.W #1,D2⓪'BRA    IMOD1⓪ !IMOD3 LSR.L  #1,D0⓪ !IMOD5 CMP.L  D0,D1⓪'BCS    IMOD4⓪'SUB.L  D0,D1⓪ !IMOD4 DBEQ   D2,IMOD3⓪'TST.W  D5⓪'BEQ    IMOD6⓪'NEG.L  D1⓪ !IMOD6 MOVE.L D1,(A3)+⓪'MOVE.L (A7)+,D5⓪'RTS⓪'⓪ IMODER LINK   A5,#0⓪'TRAP    #6          ; Div by zero⓪'DC.W    -5-$4000⓪'CLR.L   (A3)+⓪'MOVE.L (A7)+,D5⓪'UNLK   A5⓪#END⓪ END @IMOD;⓪ ⓪ PROCEDURE @CMOD (a,b:LONGCARD):LONGCARD;⓪ BEGIN⓪ ASSEMBLER⓪'MOVE.L D3,-(A7)⓪'MOVE.L -(A3),D0⓪'BEQ    CMERR⓪'MOVE.L -(A3),D1⓪'CLR.L  D2⓪'MOVE.L D0,D3⓪'BMI    CMOD2⓪ !CMOD1 CMP.L  D0,D1⓪'BLS    CMOD2⓪'ADDQ   #1,D2⓪'ASL.L  #1,D0⓪'BPL    CMOD1⓪ !CMOD2 CMP.L  D0,D1⓪'BCS    CMOD3⓪'SUB.L  D0,D1⓪ !CMOD3 LSR.L  #1,D0⓪'CMP.L  D1,D3⓪'DBHI   D2,CMOD2⓪'⓪'MOVE.L D1,(A3)+⓪'MOVE.L (A7)+,D3⓪'RTS⓪'⓪ !CMERR LINK   A5,#0⓪'TRAP    #6          ; Div by zero⓪'DC.W    -5-$4000⓪'CLR.L   (A3)+⓪'MOVE.L (A7)+,D3⓪'UNLK   A5⓪#END⓪ END @CMOD;⓪ ⓪ PROCEDURE @ASGN;⓪ BEGIN⓪#ASSEMBLER⓪'MOVE.L   -(A3),A0⓪$!X MOVE.W   (A0)+,(A4)+⓪'DBF      D0,X⓪#END⓪ END @ASGN;⓪ ⓪ PROCEDURE @STAS;⓪ (* D0: LAENGE DES SOURCESTRING/BYTE; D1: LAENGE DEST.STRING/BYTE *)⓪ BEGIN⓪#ASSEMBLER⓪'MOVE.L  A3,A0⓪'MOVE.L  D0,D2⓪'ADDQ.L  #1,D0     ; D0 als StackOffset: muss synch. werden!⓪'ANDI.W  #$FFFE,D0 ; nicht BCLR verwenden, sonst Fehler bei DBEQ (unten)⓪'SUBA.L  D0,A0     ; A0 zeigt auf Sourcestring⓪'BRA     y⓪$⓪$z  SWAP    D1        ;*** Kopierschleife⓪$x  SUBQ.L  #1,D2⓪'BCS     ok2       ; Source-Ende, Dest. muss Endmarke bekommen⓪'MOVE.B  (A0)+,(A4)+⓪$y  DBEQ    D1,x⓪'BEQ     ok        ; Endmarke der Source wurde eben kopiert⓪'SWAP    D1⓪'DBF     D1,z⓪'⓪'TST.L   D2        ;*** Ende der Schleife, weil Dest voll⓪'BEQ     ok        ; Source komplett kopiert (hatte keine Endmarke)⓪'TST.B   (A0)⓪'BEQ     ok        ; sonst muss die Endmarke das naechste Zeichen sein⓪'SUBA.L  D0,A3     ; leider nein: String Overflow⓪'TRAP    #6⓪'DC.W    -8-$4000⓪#ok2 CLR.B   (A4)+⓪#ok  SUBA.L  D0,A3⓪#END⓪ END @STAS;⓪ ⓪ ⓪ PROCEDURE @COPY;⓪"BEGIN⓪$ASSEMBLER⓪&move.l  (a7)+,A1          ;Ruecksprung-Adr⓪&⓪&; Platzbedarf ausrechnen⓪&⓪&move.w  -2(a3),d1         ;High-Wert⓪&addq.w  #1,d1             ;Anzahl Elemente⓪&mulu    d0,d1             ; * Elementlaenge = Anzahl Bytes⓪&addq.l  #1,d1             ;synchronisieren⓪&bclr    #0,d1⓪&⓪&; Platz reservieren, Pointer bereitstellen⓪&⓪&suba.l  d1,a7⓪&movea.l -6(a3),A2         ;^ Source-Daten⓪&move.l  a7,-6(a3)         ;neuer ^ Kopie⓪&movea.l a7,a0             ;^ fuer Kopierschleife⓪&move.l  d1,-(a7)          ;fuer Release⓪&⓪&; Kopierschleife⓪&⓪&bra     lp2⓪!lp1  swap    d1⓪!lp   move.b  (A2)+,(a0)+       ;schoen langsam umkopieren...⓪!lp2  dbf     d1,lp⓪&swap    d1⓪&dbf     d1,lp1⓪&⓪&jmp     (A1)              ;zurueck zum Aufrufer⓪$END⓪"END @COPY;⓪ ⓪ ⓪ PROCEDURE @COPS;⓪"BEGIN⓪$ASSEMBLER⓪&move.l  (a7)+,A1          ;Ruecksprung-Adr⓪&move.l  (a7)+,d2          ;Adresse der zu rufenden Prozedur retten⓪&⓪&; Platzbedarf ausrechnen⓪&⓪&move.w  -2(a3),d1         ;High-Wert⓪&addq.w  #1,d1             ;Anzahl Elemente⓪&mulu    d0,d1             ; * Elementlaenge = Anzahl Bytes⓪&addq.l  #1,d1             ;synchronisieren⓪&bclr    #0,d1⓪&⓪&; Platz reservieren, Pointer bereitstellen⓪&⓪&suba.l  d1,a7⓪&movea.l -6(a3),A2         ;^ Source-Daten⓪&move.l  a7,-6(a3)         ;neuer ^ Kopie⓪&movea.l a7,a0             ;^ fuer Kopierschleife⓪&move.l  d1,-(a7)          ;fuer Release⓪&⓪&; Kopierschleife⓪&⓪&bra     lp2⓪!lp1  swap    d1⓪!lp   move.b  (A2)+,(a0)+       ;schoen langsam umkopieren...⓪!lp2  dbf     d1,lp⓪&swap    d1⓪&dbf     d1,lp1⓪&⓪&move.l  d2,-(a7)⓪&jmp     (A1)              ;zurueck zum Aufrufer⓪$END⓪"END @COPS;⓪ ⓪ PROCEDURE @SCAS; END @SCAS;⓪ ⓪ PROCEDURE @RES1;  (* Procedure Entry ohne Priority *)⓪"BEGIN⓪$ASSEMBLER⓪(; Null-Link (keine Parameter, keine lok. Vars), norm. $200 Stack-Check⓪(LEA     $200(A3),A0⓪(CMPA.L  A7,A0⓪(BCC     stackerror⓪&cont⓪(MOVE.L  (A7)+,A0⓪(LINK    A5,#$0000⓪(MOVE.L  A7,A2⓪(MOVEM.L A4/A6,-(A7)⓪(MOVE.L  A2,A6⓪(JMP     (A0)⓪&stackerror⓪(TRAP    #6⓪(DC.W    $BFF6    ; Stack overflow, caller caused⓪(BRA     cont⓪$END⓪"END @RES1;⓪ ⓪ PROCEDURE @RES2;  (* Procedure Entry ohne Priority *)⓪"BEGIN⓪$ASSEMBLER⓪(; D0.W: Link-Wert⓪(; als Stacksicherheitswert wird $200 angenommen⓪(LEA     $200(A3),A0⓪(ADDA.W  D0,A0⓪(CMPA.L  A7,A0⓪(BCC     stackerror⓪&cont⓪(MOVE.L  (A7)+,A0⓪(; LINK #<D0>,A5:⓪(MOVE.L  A5,-(A7)⓪(MOVE.L  A7,A5⓪(SUBA.W  D0,A7⓪(⓪(MOVE.L  A7,A2⓪(MOVEM.L A4/A6,-(A7)⓪(MOVE.L  A2,A6⓪(JMP     (A0)⓪&stackerror⓪(TRAP    #6⓪(DC.W    $BFF6    ; Stack overflow, caller caused⓪(BRA     cont⓪$END⓪"END @RES2;⓪ ⓪ PROCEDURE @RES3; END @RES3;⓪ PROCEDURE @RES4; END @RES4;⓪ PROCEDURE @RES5; END @RES5;⓪ PROCEDURE @RES6; END @RES6;⓪ PROCEDURE @RES7; END @RES7;⓪ PROCEDURE @RES8; END @RES8;⓪ PROCEDURE @RES9; END @RES9;⓪ ⓪ ⓪ PROCEDURE CAP (ch: CHAR): CHAR;⓪ BEGIN⓪"ASSEMBLER⓪(CLR     D0⓪(MOVE.B  -2(A3),D0⓪(LEA     tab(PC),A0⓪(MOVE.B  0(A0,D0.W),-2(A3)⓪(RTS⓪"⓪"tab:  DC.B $00,$01,$02,$03,$04,$05,$06,$07,$08,$09,$0A,$0B,$0C,$0D,$0E,$0F⓪(DC.B $10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$1A,$1B,$1C,$1D,$1E,$1F⓪(DC.B ' ','!','"','#','$','%','&',$27,'(',')','*','+',',','-','.','/'⓪(DC.B '0','1','2','3','4','5','6','7','8','9',':',';','<','=','>','?'⓪(DC.B '@','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O'⓪(DC.B 'P','Q','R','S','T','U','V','W','X','Y','Z','[','\',']','^','_'⓪(DC.B '`','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O'⓪(DC.B 'P','Q','R','S','T','U','V','W','X','Y','Z','{','|','}','~',''⓪(DC.B 'Ç','Ü','É','A','Ä','À','Å','Ç','E','E','E','I','I','I','Ä','Å'⓪(DC.B 'É','Æ','Æ','O','Ö','O','U','U','ÿ','Ö','Ü','¢','£','¥','ß','ƒ'⓪(DC.B 'A','I','O','U','Ñ','Ñ','ª','º','¿','⌐','¬','½','¼','¡','«','»'⓪(DC.B 'Ã','Õ','Ø','Ø','Œ','Œ','À','Ã','Õ','¨','´','†','¶','©','®','™'⓪(DC.B 'IJ','IJ','א','ב','ג','ד','ה','ו','ז','ח','ט','י','כ','ל','מ','נ'⓪(DC.B 'ס','ע','פ','צ','ק','ר','ש','ת','ן','ך','ם','ף','ץ','§','∧','∞'⓪(DC.B 'α','β','Γ','π','Σ','σ','µ','τ','Φ','Θ','Ω','δ','∮','ϕ','∈','∩'⓪(DC.B '≡','±','≥','≤','⌠','⌡','÷','≈','°','∙','·','√','ⁿ','²','³','¯'⓪"END⓪ END CAP;⓪ ⓪ ⓪ PROCEDURE CHR (c: WORD): CHAR;⓪ BEGIN ASSEMBLER⓪(MOVE.B  -(A3),D0        ;Low-Byte wird Char⓪(TST.B   -(A3)⓪(BEQ     ok              ;High-Byte muss 0 sein⓪(LINK    A5,#0⓪(TRAP    #6⓪(DC.W    -7-$4000 ;Overflow⓪(UNLK    A5⓪#ok   MOVE.B  D0,(A3)+⓪(CLR.B   (A3)+⓪'END⓪ END CHR;⓪ ⓪ PROCEDURE HALT;⓪ BEGIN⓪"ASSEMBLER⓪(LINK    A5,#0⓪(TRAP    #6⓪(DC.W    -11-$4000       ; HALT⓪(UNLK    A5⓪"END⓪ END HALT;⓪ ⓪ PROCEDURE FLOAT(i: LONGCARD): LONGREAL;⓪ BEGIN⓪"ASSEMBLER⓪ (*$? ~A68881 & ~M68881:⓪&MOVE.W #$0102,D0  ;Exponent 32⓪&MOVE.L -(A3),D1⓪&BEQ    ZERO⓪&BMI    Large      ;ist linksbündig⓪ POS   SUBQ.W #8,D0      ;linksbündig machen⓪&LSL.L  #1,D1⓪&BPL    POS⓪ Large SWAP   D0⓪&SWAP   D1⓪&MOVE.W D1,D0⓪&CLR.W  D1⓪&MOVE.L D0,(A3)+⓪&MOVE.L D1,(A3)+⓪&RTS⓪ !ZERO CLR.L (A3)+⓪&CLR.L (A3)+⓪ *)⓪ (*$? M68881:⓪(FMOVE.L -(A3),FP0    ; kein Runtime-Fehler möglich⓪(FMOVE.D FP0,(A3)+⓪ *)⓪ (*$? A68881:⓪(; FMOVE.L -(A3),FP0    ; kein Runtime-Fehler möglich⓪(MOVE.W  #$4000,fpcmd⓪ DoDl1   TST.B   fpstatlo⓪(BEQ     DoDl1⓪(MOVE.L  -(A3),fpop⓪(; FMOVE.D FP0,(A3)+⓪(MOVE.W  #$7400,fpcmd⓪ DoDl3   MOVE.B  fpstatlo,D0⓪(BEQ     DoDl3⓪(MOVE.L  fpop,(A3)+⓪(MOVE.L  fpop,(A3)+⓪(TST.B   fpstatlo⓪ *)⓪"END⓪ END FLOAT;⓪ ⓪ PROCEDURE TRUNC(r: LONGREAL): LONGCARD;⓪ BEGIN⓪"ASSEMBLER⓪ (*$? ~A68881 & ~M68881:⓪'LINK   A5,#0⓪'MOVEM.L D3-D4,-(A7)⓪ ⓪'MOVE.L -(A3),D0⓪'MOVE.L -(A3),D1⓪'SWAP   D1⓪'BTST   #0,D1⓪'BNE    nega      ;Zahl ist negativ -> Fehler⓪'ASR.W  #3,D1⓪'MOVE.W #32,D4⓪'SUB.W  D1,D4⓪'BLT    Err       ;Exponent war > 32: 0.FFF.. * 2^32 ist MaxLCard⓪'CMP.W  #32,D4⓪'BCC    ZERO      ;Exponent war <= 0⓪'MOVE.L D1,D2⓪'SWAP   D0⓪'MOVE.W D0,D2⓪'LSR.L  D4,D2⓪'BRA    X⓪!!ZERO CLR.L  D2⓪!!X    MOVE.L D2,(A3)+⓪'MOVEM.L (A7)+,D3-D4⓪'UNLK   A5⓪'RTS⓪ ⓪!!NEGA TRAP    #6⓪'DC.W    -6-$4000          ; Out of range: Arg. ist negativ⓪'BRA     cont⓪!!ERR  TRAP    #6⓪'DC.W    -7-$4000          ; Overflow: Arg. ist > MaxLCard⓪!!CONT CLR.L   (A3)+⓪'MOVEM.L (A7)+,D3-D4⓪'UNLK   A5⓪ *)⓪ (*$? M68881:⓪(; !!! Abfrage auf neg. Ergebnis und Überlauf fehlt noch!⓪(FINTRZ.D -(A3),FP0⓪(FMOVE.L  FP0,(A3)+⓪ *)⓪ (*$? A68881:⓪(; !!! Abfrage auf neg. Ergebnis fehlt noch!⓪(; FINTRZ.D -(A3),FP0⓪(MOVE.W  #$5403,fpcmd⓪ DoDl1   MOVE.B  fpstatlo,D0⓪(BEQ     DoDl1⓪(CMPI.B  #8,D0⓪(BNE     error2⓪(MOVE.L  -8(A3),fpop⓪(MOVE.L  -(A3),fpop⓪(SUBQ.L  #4,A3⓪(; FMOVE.L  FP0,(A3)+⓪(MOVE.W  #$6000,fpcmd⓪ DoDl3   MOVE.B  fpstatlo,D0⓪(BEQ     DoDl3⓪(CMPI.B  #2,D0⓪(BNE     error⓪(MOVE.L  fpop,(A3)+⓪(TST.B   fpstatlo⓪(RTS⓪ error2  SUBQ.L  #8,A3⓪ error   LINK    A5,#0⓪(JSR     FPUError⓪(UNLK    A5⓪(CLR.L   (A3)+⓪ *)⓪"END⓪ END TRUNC;⓪ ⓪ ⓪ (*$? A68881:⓪ PROCEDURE DoComp;⓪ BEGIN⓪"ASSEMBLER⓪+LEA     -16(A3),A3⓪+MOVE.L  A3,A0⓪+MOVE.W  #$5400,fpcmd⓪"!DoCl1   TST.B   fpstatlo⓪+BEQ     DoCl1⓪+MOVE.L  (A0)+,fpop⓪+MOVE.L  (A0)+,fpop⓪+MOVE.W  #$5438,fpcmd        ;FCMP  ?,FP0⓪"!DoCl2   MOVE.B  fpstatlo,D0⓪+BEQ     DoCl2⓪+CMPI.B  #8,D0⓪+BNE     DoCError⓪+MOVE.L  (A0)+,fpop⓪+MOVE.L  (A0)+,fpop⓪+MOVE.W  D1,fpcond⓪+CLR.W   D0⓪+MOVE.B  fpstatlo,D0⓪+MOVE.W  D0,(A3)+⓪+RTS⓪"!DoCError⓪+LINK    A5,#0⓪+JSR     FPUError⓪+UNLK    A5⓪+CLR     (A3)+⓪"END;⓪ END DoComp;⓪ *)⓪ ⓪ ⓪ PROCEDURE @RELE (a,b:LONGREAL):BOOLEAN;        (* Op1 <= Op2, neu *)⓪ BEGIN ASSEMBLER⓪&(*$? ~A68881:⓪(MOVEM.L D3/D4,-(A7)⓪(MOVEQ  #16,D4⓪(MOVE.L -(A3),D0    ;zweiter Operand⓪(MOVE.L -(A3),D1⓪(BEQ    zer2⓪(MOVE.L -(A3),D2    ;erster Operand⓪(MOVE.L -(A3),D3⓪(BEQ    zer1⓪(BTST   D4,D3⓪(BNE    neg1        ;Op1 negativ⓪(BTST   D4,D1⓪(BNE    neg2        ;Op2 negativ⓪(CMP.L  D1,D3       ;beide Operanden positiv⓪(BLT    neg3⓪(BGT    neg2⓪(CMP.L  D0,D2⓪(BLS    neg3⓪(BRA    neg2⓪!neg1   BTST   D4,D1⓪(BEQ    neg3        ;Op1 negativ, Op2 positiv⓪(CMP.L  D3,D1⓪(BLT    neg3⓪(BGT    neg2⓪(CMP.L  D2,D0⓪(BLS    neg3⓪!neg2   CLR.W  (A3)+       ;Op1 positiv, Op2 negativ⓪(MOVEM.L (A7)+,D3/D4⓪(RTS⓪!zer2   SUBQ.L #4,A3       ;Op2 Null, Op1 <= 0 ?⓪(MOVE.L -(A3),D3⓪(BEQ    neg3        ;Op1 = Op2 = 0⓪(BTST   D4,D3⓪(BNE    neg3        ;Op2 = 0; Op1 < 0⓪(BRA    neg2⓪!zer1   BTST   D4,D1       ;Op1 Null, Op2 # 0: ist Op2 < 0?⓪(BNE    neg2        ; ja⓪!neg3   MOVEM.L (A7)+,D3/D4⓪(MOVE.W #TRUE,(A3)+⓪&*)⓪&(*$? A68881:⓪(MOVE.W #$15,D1     ;Conditional LE⓪(JMP    DoComp⓪&*)⓪'END⓪ END @RELE;⓪ ⓪ PROCEDURE @REGE (a,b:LONGREAL):BOOLEAN;⓪ BEGIN ASSEMBLER⓪&(*$? ~A68881:⓪(MOVEM.L D3/D4,-(A7)⓪(MOVEQ  #16,D4⓪(MOVE.L -(A3),D0    ;zweiter Operand⓪(MOVE.L -(A3),D1⓪(BEQ    zer2⓪(MOVE.L -(A3),D2    ;erster Operand⓪(MOVE.L -(A3),D3⓪(BEQ    zer1⓪(BTST   D4,D3⓪(BNE    neg1        ;Op1 negativ⓪(BTST   D4,D1⓪(BNE    neg2        ;Op2 negativ⓪(CMP.L  D1,D3       ;beide Operanden positiv⓪(BLT    neg3⓪(BGT    neg2⓪(CMP.L  D0,D2⓪(BCS    neg3⓪(BRA    neg2⓪!neg1   BTST   D4,D1⓪(BEQ    neg3        ;Op1 negativ, Op2 positiv⓪(CMP.L  D3,D1⓪(BLT    neg3⓪(BGT    neg2⓪(CMP.L  D2,D0⓪(BCS    neg3⓪!neg2   MOVE.W #true,(A3)+ ;Op1 positiv, Op2 negativ⓪(MOVEM.L (A7)+,D3/D4⓪(RTS⓪!zer2   SUBQ.L #4,A3       ;Op2 Null, Op1 <= 0 ?⓪(MOVE.L -(A3),D3⓪(BEQ    neg2        ;beide Null⓪(BTST   D4,D3⓪(BNE    neg3        ;Op2 = 0, Op1 < 0⓪(BRA    neg2        ;Op2 = 0, Op1 > 0⓪!zer1   BTST   D4,D1       ;Op1 = 0, Op2 # 0: ist Op2 > 0?⓪(BNE    neg2        ; nein⓪!neg3   CLR.W  (A3)+       ;Op1 negativ, Op2 positiv⓪(MOVEM.L (A7)+,D3/D4⓪&*)⓪&(*$? A68881:⓪(MOVE.W #$13,D1     ;Conditional GE⓪(JMP    DoComp⓪&*)⓪#END⓪ END @REGE;⓪ ⓪ PROCEDURE @RELT (a,b:LONGREAL):BOOLEAN;⓪ BEGIN ASSEMBLER⓪&(*$? ~A68881:⓪(MOVEM.L D3/D4,-(A7)⓪(MOVEQ  #16,D4⓪(MOVE.L -(A3),D0    ;zweiter Operand⓪(MOVE.L -(A3),D1⓪(BEQ    zer2⓪(MOVE.L -(A3),D2    ;erster Operand⓪(MOVE.L -(A3),D3⓪(BEQ    zer1⓪(BTST   D4,D3⓪(BNE    neg1        ;Op1 negativ⓪(BTST   D4,D1⓪(BNE    neg2        ;Op2 negativ⓪(CMP.L  D1,D3       ;beide Operanden positiv⓪(BLT    neg3⓪(BGT    neg2⓪(CMP.L  D0,D2⓪(BCS    neg3⓪(BRA    neg2⓪!neg1   BTST   D4,D1⓪(BEQ    neg3        ;Op1 negativ, Op2 positiv⓪(CMP.L  D3,D1⓪(BLT    neg3⓪(BGT    neg2⓪(CMP.L  D2,D0⓪(BCS    neg3⓪!neg2   CLR.W  (A3)+       ;Op1 positiv, Op2 negativ⓪(MOVEM.L (A7)+,D3/D4⓪(RTS⓪!zer2   SUBQ.L #4,A3       ;Op2 Null, Op1 <= 0 ?⓪(MOVE.L -(A3),D3⓪(BEQ    neg2        ;beide Null⓪(BTST   D4,D3⓪(BNE    neg3        ;Op2 = 0, Op1 < 0⓪(BRA    neg2        ;Op2 = 0, Op1 > 0⓪!zer1   BTST   D4,D1       ;Op1 = 0, Op2 # 0: ist Op2 > 0?⓪(BNE    neg2        ; nein⓪!neg3   MOVE.W #TRUE,(A3)+ ;Op1 negativ, Op2 positiv⓪(MOVEM.L (A7)+,D3/D4⓪&*)⓪&(*$? A68881:⓪(MOVE.W #$14,D1     ;Conditional LT⓪(JMP    DoComp⓪&*)⓪&END⓪ END @RELT;⓪ ⓪ PROCEDURE @REGT (a,b:LONGREAL):BOOLEAN;⓪ BEGIN⓪"ASSEMBLER⓪"(*$? ~A68881:⓪(MOVEM.L D3/D4,-(A7)⓪(MOVEQ  #16,D4⓪(MOVE.L -(A3),D0    ;zweiter Operand⓪(MOVE.L -(A3),D1⓪(BEQ    zer2⓪(MOVE.L -(A3),D2    ;erster Operand⓪(MOVE.L -(A3),D3⓪(BEQ    zer1⓪(BTST   D4,D3⓪(BNE    neg1        ;Op1 negativ⓪(BTST   D4,D1⓪(BNE    neg2        ;Op2 negativ⓪(CMP.L  D1,D3       ;beide Operanden positiv⓪(BLT    neg3⓪(BGT    neg2⓪(CMP.L  D0,D2⓪(BLS    neg3⓪(BRA    neg2⓪!neg1   BTST   D4,D1⓪(BEQ    neg3        ;Op1 negativ, Op2 positiv⓪(CMP.L  D3,D1⓪(BLT    neg3⓪(BGT    neg2⓪(CMP.L  D2,D0⓪(BLS    neg3⓪!neg2   MOVE.W #true,(A3)+ ;Op1 positiv, Op2 negativ⓪(MOVEM.L (A7)+,D3/D4⓪(RTS⓪!zer2   SUBQ.L #4,A3       ;Op2 Null, Op1 <= 0 ?⓪(MOVE.L -(A3),D3⓪(BEQ    neg3        ;beide Null⓪(BTST   D4,D3⓪(BNE    neg3        ;Op2 = 0, Op1 < 0⓪(BRA    neg2        ;Op2 = 0, Op1 > 0⓪!zer1   BTST   D4,D1       ;Op1 = 0, Op2 # 0: ist Op2 > 0?⓪(BNE    neg2        ; nein⓪!neg3   CLR.W  (A3)+       ;Op1 negativ, Op2 positiv⓪(MOVEM.L (A7)+,D3/D4⓪!*)⓪!(*$? A68881:⓪(MOVE.W #$12,D1     ;Conditional GT⓪(JMP    DoComp⓪!*)⓪&END⓪ END @REGT;⓪ ⓪ ⓪ (********* Real-Arithmetik *********)⓪ PROCEDURE @RNEG (a:LONGREAL):LONGREAL;⓪ BEGIN⓪"ASSEMBLER⓪"(*$? ~A68881:⓪(TST.W  -8(A3)⓪(BEQ    ZERO⓪(BCHG   #0,-7(A3)⓪"!ZERO⓪"*)⓪"(*$? A68881:⓪(TST     -8(A3)⓪(BEQ     zero⓪(BCHG    #7,-8(A3)⓪"!zero RTS⓪"*)⓪$RTS⓪"END⓪ END @RNEG;⓪ ⓪ (*$? A68881:⓪ PROCEDURE DoDouble;⓪ (* Erwartet in Register D1 eine Co-Instruction *)⓪ BEGIN⓪"ASSEMBLER⓪+LEA     -16(A3),A3⓪+MOVE.L  A3,A0⓪+MOVE.W  #$5400,fpcmd⓪"!DoDl1   TST.B   fpstatlo⓪+BEQ     DoDl1⓪+MOVE.L  (A0)+,fpop⓪+MOVE.L  (A0)+,fpop⓪+MOVE.W  D1,fpcmd⓪"!DoDl2   TST.B   fpstatlo⓪+BEQ     DoDl2⓪+MOVE.L  (A0)+,fpop⓪+MOVE.L  (A0)+,fpop⓪+MOVE.W  #$7400,fpcmd⓪"!DoDl3   MOVE.B  fpstatlo,D0⓪+BEQ     DoDl3⓪+CMPI.B  #8,D0⓪+BNE     DoDErr⓪"!GoBack  MOVE.L  fpop,(A3)+⓪+MOVE.L  fpop,(A3)+⓪+MOVE.W  fpstat,D0⓪+CMPI.B  #2,D0⓪+BNE     DoDErr2⓪+RTS⓪"!DoDErr2 SUBQ.L  #8,A3⓪"!DoDErr  LINK    A5,#0⓪+JSR     FPUError⓪+UNLK    A5⓪+CLR.L   (A3)+        ; RETURN 0.0⓪+CLR.L   (A3)+⓪"END;⓪ END DoDouble;⓪ *)⓪ ⓪ PROCEDURE @RMUL (a,b:LONGREAL):LONGREAL;⓪ BEGIN⓪"ASSEMBLER⓪"(*$? ~A68881:⓪+LINK    A5,#0⓪+MOVEM.L D3-D7,-(A7)⓪+MOVEM.W -16(A3),D0-D7⓪+TST.W   D0           ;Op1 = 0 ?⓪+BEQ.L   ZERO⓪+TST.W   D4           ;Op2 = 0 ?⓪+BEQ.L   ZERO⓪+ADD.W   D0,D4        ;vorl. Exponent; neues Sign in bit0⓪+BVS.L   range        ;Ueber/Unterlauf⓪+MOVE.W  D4,-(A7)⓪+MOVE.W  D3,D4⓪+MULU    D7,D4⓪+CLR.W   D4⓪+SWAP    D4⓪+CLR.W   D5⓪+MOVE.W  D3,D0⓪+MULU    D6,D0⓪+ADD.L   D0,D4⓪+BCC     L0⓪+ADDQ.W  #1,D5⓪"!L0      MOVE.W  D2,D0⓪+MULU    D7,D0⓪+ADD.L   D0,D4⓪+BCC     L1⓪+ADDQ.W  #1,D5⓪"!L1      MOVE.W  D5,D4⓪+SWAP    D4⓪+CLR.W   D5⓪+MULU    D1,D7⓪+ADD.L   D7,D4⓪+BCC     L2⓪+ADDQ.W  #1,D5⓪"!L2      MOVE.W  -6(A3),D7⓪+MOVE.W  D2,D0⓪+MULU    D6,D0⓪+ADD.L   D0,D4⓪+BCC     L3⓪+ADDQ.W  #1,D5⓪"!L3      MULU    D7,D3⓪+ADD.L   D3,D4⓪+BCC     L4⓪+ADDQ.W  #1,D5⓪"!L4      MOVE.W  D4,D3⓪+MOVE.W  D5,D4⓪+SWAP    D4⓪+CLR.W   D5⓪+MULU    D7,D2⓪+ADD.L   D2,D4⓪+BCC     L5⓪+ADDQ.W  #1,D5⓪"!L5      MULU    D1,D6⓪+ADD.L   D6,D4⓪+BCC     L6⓪+ADDQ.W  #1,D5⓪"!L6      MOVE.W  D4,D6⓪+MOVE.W  D5,D4⓪+SWAP    D4⓪+MULU    D7,D1⓪+⓪+MOVE.W  (A7)+,D7⓪+ADD.L   D1,D4⓪+BMI     ISADJ⓪+ADD.W   D3,D3⓪+ADDX.W  D6,D6⓪+ADDX.L  D4,D4⓪+SUBQ.W  #8,D7⓪+BVS     ZERO⓪"!ISADJ   TST.W   D3⓪+BPL     NORND⓪+ADDQ.W  #1,D6⓪+BCC     NORND⓪+ADDQ.L  #1,D4⓪+BCC     NORND⓪+ADDQ.W  #8,D7⓪+BSET    #31,D4⓪"!NORND   BSET    #1,D7        ;markiere als # 0⓪+BCLR    #2,D7        ;loesche Schutzbit⓪+SUBA.W  #16,A3⓪+MOVE.W  D7,(A3)+⓪+MOVE.L  D4,(A3)+⓪+MOVE.W  D6,(A3)+⓪+MOVEM.L (A7)+,D3-D7⓪+UNLK    A5⓪+RTS⓪+⓪"range    BMI     ovfl         ;Summe der Exponenten war so gross,⓪@;dass sie ins negative ueberlief⓪"zero     SUBA.W  #16,A3⓪+CLR.L   (A3)+⓪+CLR.L   (A3)+⓪+MOVEM.L (A7)+,D3-D7⓪+UNLK    A5⓪+RTS⓪+⓪"ovfl     SUBA.W  #16,A3⓪+TRAP    #6⓪+DC.W    -7-$4000     ;overflow⓪+CLR.L   (A3)+⓪+CLR.L   (A3)+⓪+MOVEM.L (A7)+,D3-D7⓪+UNLK    A5⓪"*)⓪"(*$? A68881:⓪+MOVE.W  #$5423,D1⓪+JMP     DoDouble⓪"*)⓪"END⓪ END @RMUL;⓪ ⓪ ⓪ PROCEDURE @RDIV (a,b:LONGREAL):LONGREAL;⓪ BEGIN⓪"ASSEMBLER⓪"(*$? ~A68881:⓪(LINK    A5,#0⓪(MOVEM.L D3-D7,-(A7)⓪(MOVE.W  -(A3),D5⓪(MOVE.L  -(A3),D4⓪(MOVE.W  -(A3),D1⓪(MOVE.W  -(A3),D3⓪(MOVE.L  -(A3),D2⓪(MOVE.W  -(A3),D0⓪(JSR     @FPDIV⓪(MOVEM.L (A7)+,D3-D7⓪(UNLK    A5⓪"*)⓪"(*$? A68881:⓪'MOVE.W   #$5420,D1⓪'JMP      DoDouble⓪"*)⓪"END⓪ END @RDIV;⓪ ⓪ PROCEDURE @FPDIV;⓪ BEGIN⓪"ASSEMBLER⓪"(*$? ~A68881:⓪+TST.W   D0⓪+BEQ.L   ZERO1⓪+TST.W   D1⓪+BEQ.L   DIVBY0⓪+BCLR    #1,D1        ; !TT 01.04.88⓪+SUB.W   D1,D0        ;vorl. Exponent und Sign in D0⓪+BVS.L   range        ;Ueber/Unterlauf⓪+CLR.L   D7⓪+MOVEQ   #49,D1⓪+BRA     L1⓪"!L0      ADD.L   D7,D7⓪+ADDX.L  D6,D6⓪+ADD.W   D3,D3⓪+ADDX.L  D2,D2⓪+BCS     ONEBIT⓪"!L1      CMP.L   D2,D4⓪+BHI     ZERBIT⓪+BNE     ONEBIT⓪+CMP.W   D3,D5⓪+BHI     ZERBIT⓪"!ONEBIT  SUB.W   D5,D3⓪+SUBX.L  D4,D2⓪+ADDQ.B  #1,D7⓪"!ZERBIT  DBF     D1,L0⓪+BTST    #17,D6⓪+BEQ     LESS05⓪+LSR.L   #1,D6⓪+ROXR.L  #1,D7⓪+ADDQ.W  #8,D0⓪+BVS     ovfl⓪"!LESS05  LSR.L   #1,D6⓪+ROXR.L  #1,D7⓪+BCC     NORND⓪+ADDQ.L  #1,D7⓪+BCC     NORND⓪+ADDQ.W  #1,D6⓪+BCC     NORND⓪+ROXR.W  #1,D6⓪+ADDQ.W  #8,D0⓪+BVS     ovfl⓪"noRnd    BSET    #1,D0⓪+BCLR    #2,D0⓪+MOVE.W  D0,(A3)+⓪+MOVE.W  D6,(A3)+⓪+MOVE.L  D7,(A3)+⓪+RTS⓪+⓪"range    BMI     ovfl         ;Differenz der Exponenten war so gross,⓪@;dass sie ins negative ueberlief⓪"zero1    CLR.L   (A3)+⓪+CLR.L   (A3)+⓪+RTS⓪+⓪"ovfl     TRAP    #6⓪+DC.W    -7-$4000     ;overflow⓪+BRA     errend⓪+⓪"DivBy0   TRAP    #6⓪+DC.W    -5-$4000⓪"errend:  CLR.L   (A3)+⓪+CLR.L   (A3)+⓪"*)⓪"(*$? A68881:⓪+MOVE.W  D0,(A3)+⓪+MOVE.L  D2,(A3)+⓪+MOVE.W  D3,(A3)+⓪+MOVE.W  D1,(A3)+⓪+MOVE.L  D4,(A3)+⓪+MOVE.W  D5,(A3)+⓪+MOVE.W  #$5420,D1⓪+JMP     DoDouble⓪"*)⓪"END⓪ END @FPDIV;⓪ ⓪ ⓪ PROCEDURE @RADD (a,b:LONGREAL):LONGREAL;⓪ BEGIN⓪%ASSEMBLER⓪%(*$? ~A68881:⓪+LINK    A5,#0⓪+MOVEM.L D3-D7,-(A7)⓪+MOVEM.W -16(A3),D0-D7⓪+SWAP    D1⓪+MOVE.W  D2,D1        ;höchste 32 Mant.-Stellen (a) in D1⓪+SWAP    D5⓪+MOVE.W  D6,D5        ;höchste 32 Mant.-Stellen (b) in D5⓪+⓪+ANDI.W  #$FFFE,D0⓪+BEQ.L   RETN2        ;ein Argument ist 0⓪+ANDI.W  #$FFFE,D4⓪+BEQ.L   RETN1        ;ein Argument ist 0⓪+CLR.W   D6⓪+CMP.W   D0,D4⓪+BLT     PASST⓪+BNE     TAUSCH⓪+CMP.L   D1,D5⓪+BCS.L   PASST1⓪+BNE     TAUSCH⓪+CMP.W   D3,D7⓪+BLS.L   PASST1⓪"!TAUSCH  EXG     D0,D4⓪+EXG     D1,D5⓪+EXG     D3,D7⓪+MOVE.W  -16(A3),D2⓪+MOVE.W  -8(A3),-16(A3)⓪+MOVE.W  D2,-8(A3)⓪"⓪"!PASST   SUB.W   D4,D0        ;Exp.differenz immer positiv!⓪+LSR     #3,D0⓪+BEQ.L   PASST1⓪+CMP.W   #16,D0⓪+BEQ     S16⓪+BHI     SGT16⓪+SWAP    D7⓪+MOVE.W  D5,D7⓪+SWAP    D7⓪+LSR.L   D0,D5⓪+LSR.L   D0,D7⓪+BRA.L   DONE⓪"!S16     ADD.W   D7,D7⓪+MOVE.W  D5,D7⓪+CLR.W   D5⓪+SWAP    D5⓪+BRA     DONE⓪"!SGT16   CMP.W   #32,D0⓪+BEQ     S32⓪+BHI     SGT32⓪+SUB.W   #16,D0⓪+LSR.L   D0,D5⓪+MOVE.W  D5,D7⓪+CLR.W   D5⓪+SWAP    D5⓪+BRA     DONE⓪"!S32     ADD.W   D5,D5⓪+SWAP    D5⓪+MOVE.W  D5,D7⓪+CLR.L   D5⓪+BRA     DONE⓪"!S48     CLR.L   D5⓪+CLR.W   D7⓪+MOVEQ   #$FF,D6⓪+BRA     PASST1⓪"!SGT32   CMP.W   #48,D0⓪+BEQ     S48⓪+BHI.L   RETN1⓪+SUB.W   #32,D0⓪+SWAP    D5⓪+MOVE.W  D5,D7⓪+CLR.L   D5⓪+LSR.W   D0,D7⓪"!DONE    ROXR.W  #1,D6⓪"!PASST1  MOVE.W  -16(A3),D2   ;Vorzeichen beider Operanden gleich?⓪+MOVE.W  -8(A3),D0⓪+ADD.W   D2,D0⓪+BTST    #0,D0⓪+BNE     SUBTR⓪+ADD.W   D7,D3⓪+ADDX.L  D5,D1⓪+BCC     NOFL⓪+ROXR.L  #1,D1⓪+ROXR.W  #1,D3⓪+BCC     INCEX⓪+ADDQ.W  #1,D3⓪+BCC     INCEX⓪+ADDQ.L  #1,D1⓪"!INCEX   ADDQ.W  #8,D2        ;D2 ist Exp. der betr.mäßig größeren Zahl⓪+BVS.L   OVFL⓪"!FERTIG  SUBA.W  #16,A3⓪+MOVE.W  D2,(A3)+⓪+MOVE.L  D1,(A3)+⓪+MOVE.W  D3,(A3)+⓪+MOVEM.L (A7)+,D3-D7⓪+UNLK    A5⓪+RTS⓪+⓪"!NOFL    TST.W   D6⓪+BPL     FERTIG⓪+ADDQ.W  #1,D3⓪+BCC     FERTIG⓪+ADDQ.L  #1,D1⓪+BCC     FERTIG⓪+ROXR.L  #1,D1⓪+BRA     INCEX⓪"⓪"!SUBTR   ADD.W   D6,D6⓪+SCS     D6⓪+SUBX.W  D7,D3⓪+SUBX.L  D5,D1⓪+TST.L   D1⓪+BMI     FERTIG⓪+SUBQ.W  #8,D2⓪+ADD.W   D6,D6⓪+ADDX.W  D3,D3⓪+ADDX.L  D1,D1⓪+BMI.L   fertig⓪+BEQ     LGT32        ;Ausloeschung in der Mantisse.. normalisieren⓪+SWAP    D1⓪+TST.W   D1⓪+BNE     LLT16⓪+MOVE.W  D3,D1⓪+CLR.W   D3⓪+SUB.W   #128,D2      ;8 * (16 bit Shift)⓪+BVS     zero⓪+TST.L   D1⓪+BMI     fertig⓪"!L0      SUBQ.W  #8,D2⓪+BVS     zero⓪+ADD.L   D1,D1⓪+BPL     L0⓪+BRA     fertig⓪"!LLT16   SWAP    D1⓪"!L1      SUBQ.W  #8,D2⓪+BVS     zero⓪+ADD.W   D3,D3⓪+ADDX.L  D1,D1⓪+BPL     L1⓪+BRA     fertig⓪"!LGT32   SUB.W   #256,D2      ;8 * (32 bit Shift)⓪+BVS     zero⓪+MOVE.W  D3,D1⓪+BEQ.L   ZERO⓪+BMI     L3⓪"!L2      SUBQ.W  #8,D2⓪+BVS     zero⓪+ADD.W   D1,D1⓪+BPL     L2⓪"!L3      SWAP    D1⓪+CLR.W   D3⓪+BRA     fertig⓪"!ZERO    SUBA.W  #16,A3⓪+CLR.L   (A3)+⓪+CLR.L   (A3)+⓪+MOVEM.L (A7)+,D3-D7⓪+UNLK    A5⓪+RTS⓪+⓪"!RETN1   SUBA.W  #14,A3       ;Exponent stimmt schon⓪+MOVE.L  D1,(A3)+     ;Mantisse muß (bei Ausgang 2 hierher)⓪+MOVE.W  D3,(A3)+     ; noch getauscht werden!⓪+MOVEM.L (A7)+,D3-D7⓪+UNLK    A5⓪+RTS⓪+⓪"!RETN2   MOVE.L  -(A3),-8(A3)⓪+MOVE.L  -(A3),-8(A3)⓪+MOVEM.L (A7)+,D3-D7⓪+UNLK    A5⓪+RTS⓪+⓪"!OVFL    TRAP    #6⓪+DC.W    -7-$4000      ;overflow⓪+BRA     ZERO⓪"*)⓪"(*$? A68881:⓪+MOVE.W  #$5422,D1⓪+JMP     DoDouble⓪"*)⓪"END⓪ END @RADD;⓪ ⓪ PROCEDURE @RSUB (a,b:LONGREAL):LONGREAL;⓪ BEGIN⓪"ASSEMBLER⓪"(*$? ~A68881:⓪$TST.W  -8(A3)⓪$BEQ    N⓪$BCHG   #0,-7(A3)⓪"N JMP    @RADD⓪"*)⓪"(*$? A68881:⓪$MOVE.W #$5428,D1⓪$JMP    DoDouble⓪"*)⓪"END⓪ END @RSUB;⓪ ⓪ ⓪ BEGIN⓪"has020:= SysInfo.Has020 ();⓪ (*$? A68881:⓪"FPUInit⓪ *)⓪ END Runtime.⓪ ə
  2. (* $00000A8D$FFFB3F34$FFFB3F34$FFFB3F34$FFFB3F34$FFFB3F34$FFFB3F34$FFFB3F34$FFFB3F34$FFFB3F34$FFFB3F34$FFFB3F34$FFFB3F34$FFFB3F34$FFFB3F34$FFEE685A$FFFB3F34$FFFB3F34$FFFB3F34$FFFB3F34$FFFB3F34$FFFB3F34$FFFB3F34$FFFB3F34$FFFB3F34$FFFB3F34$FFFB3F34$FFFB3F34$FFFB3F34$FFFB3F34$FFFB3F34$FFFB3F34$FFFB3F34$FFFB3F34$FFFB3F34$FFFB3F34$FFFB3F34$FFFB3F34$FFFB3F34$FFFB3F34$FFFB3F34$FFFB3F34Ç$00000A3FT.......T.......T.......T.......T.......T.......T.......T.......T.......T.......$00000028$FFEE685A$000014A5$00001A0C$00002342$00002CC0$00003461$0000352F$0000372B$00003739$00000A3F$000097A0$00009EAD$00009EB7$0000AC5E$0000AC68¼Çâ*)
  3.